/**********************************************************************************************/
/* FBL_File_RAM.h																			  */
/*                                                                       					  */
/* Copyright Paradigma, 1993-2006                                       					  */
/* All Rights Reserved.                                                 					  */
/**********************************************************************************************/

#ifndef _FBL_File_RAM_h
	#define _FBL_File_RAM_h

#include <VShared/FBL/publ/Headers/FBL_pre_header.h>

#include <VShared/FBL/publ/File_OS/FBL_File.h>

// STD:
#undef new
#include <vector>

#if DEBUG_NEW
#define new NEW
#endif // DEBUG_NEW


/**********************************************************************************************/
FBL_Begin_Namespace


/**********************************************************************************************/
class FBL_SHARED_EXP_CLASS File_RAM : public File
{
		IMPLEMENT_UNKNOWN(File_RAM)											
		BEGIN_INTERFACE_TABLE(File_RAM)										
			IMPLEMENT_INTERFACE(I_File)										
			IMPLEMENT_INTERFACE(I_AspectHost)
		END_INTERFACE_TABLE()
 
		friend class FileIterator_RAM;


	public://///////////////////////////////////////////////////////////////////////////////////

							File_RAM( void );

virtual						~File_RAM( void );


	public://///////////////////////////////////////////////////////////////////////////////////

// I_File

virtual bool				get_Exists( void ) const throw() { return ExistsOnDisk(); } 
		bool  		   		get_IsOpen( void ) const throw();
		bool				get_IsReadOnly( void ) const throw();
		
		bool				ExistsOnDisk( void ) const;
		void 				Flush( void );


	public://///////////////////////////////////////////////////////////////////////////////////

// THIS CLASS' API:
							
virtual uchar*				GetPageDataFromPos( ulong inPos ) throw();

	
	protected:////////////////////////////////////////////////////////////////////////////////// 

// File

		void				DoClose( void );
		void				DoCreate( void );
		void				DoOpen( void );
		
		void				DoPutLength( flength aLength );
		flength				DoGetLengthOfClosed( void ) const throw();
		flength				DoGetLengthOfOpened( void ) const throw();
		void          		DoThrowOut( void );
		
		ulong				DoRead( 
								char* 		inBuffer,
								flength		inFrom, 
								ulong 		inHowMuch );
								
		ulong				DoWrite( 
								const char* inBuffer, 
								flength		inFrom, 
								ulong 		inHowMuch );

	private:////////////////////////////////////////////////////////////////////////////////// 

		void				_Allocate(ulong inCount);
		void				_Deallocate(ulong inCount);


	private:////////////////////////////////////////////////////////////////////////////////// 

		typedef uchar byte;

		/// struct represents a single page 
		struct Page
		{
			byte mem[kPageSize];	///< page memory
		};

		typedef std::vector<Page*> TPageV;
		TPageV	mPageV;				///< vector of pages
		bool	mOpened;			///< open flag
};


/**********************************************************************************************/
FBL_End_Namespace

#include <VShared/FBL/publ/Headers/FBL_post_header.h>

#endif // _FBL_File_RAM_h
